1)

Шаблонные функции — это функции, которые работают с обобщёнными типами данных, определяемыми во время компиляции. 
Они позволяют писать универсальный код, который может использоваться с разными типами. 
Преимущества:  
    Повторное использование кода.
    Уменьшение дублирования.

2)
Специализация шаблонных функций 
Специализация позволяет определить особую реализацию шаблона для конкретного типа. Полезна, когда общий шаблон не подходит для определённых типов. 

Пример: 

template <typename T>
void print(T value) {
    std::cout << "Вывод: " << value << std::endl;
}

template <>
void print<int>(int value) {
    std::cout << "Специально для int: " << value << std::endl;
}


3)

Ошибки при несовместимых типах 
Если шаблон вызывается с несовместимыми типами, компилятор выдаст ошибку на этапе инстанциации шаблона. Например, если операция внутри шаблона недопустима для переданного типа. 

Пример:

template <typename T>
void add(T a, T b) {
    std::cout << a + b << std::endl; // Ошибка, если тип T не поддерживает оператор +
}
add(1, 2);       // OK
add("a", "b");   // Ошибка компиляции
